/// [Largest product in a series](https://projecteuler.net/problem=8)
fn main() {
    let num_str = "73167176531330624919225119674426574742355349194934
                   96983520312774506326239578318016984801869478851843
                   85861560789112949495459501737958331952853208805511
                   12540698747158523863050715693290963295227443043557
                   66896648950445244523161731856403098711121722383113
                   62229893423380308135336276614282806444486645238749
                   30358907296290491560440772390713810515859307960866
                   70172427121883998797908792274921901699720888093776
                   65727333001053367881220235421809751254540594752243
                   52584907711670556013604839586446706324415722155397
                   53697817977846174064955149290862569321978468622482
                   83972241375657056057490261407972968652414535100474
                   82166370484403199890008895243450658541227588666881
                   16427171479924442928230863465674813919123162824586
                   17866458359124566529476545682848912883142607690042
                   24219022671055626321111109370544217506941658960408
                   07198403850962455444362981230987879927244284909188
                   84580156166097919133875499200524063689912560717606
                   05886116467109405077541002256983155200055935729725
                   71636269561882670428252483600823257530420752963450"
        .replace(" ", "")
        .replace("\n", "");
    let mut num_vec: Vec<u32> = Vec::with_capacity(num_str.len());
    let mut stat = true;
    for num in num_str.chars() {
        if let Some(num) = num.to_digit(10) {
            num_vec.push(num);
        } else {
            stat = false;
            break;
        }
    }
    if stat {
        for length in &[4, 13] {
            match largest_product_in_a_series(*length, &num_vec) {
                Ok((value, list)) => {
                    let mut tmp_vec: Vec<String> = vec![];
                    for num in list {
                        tmp_vec.push(num.to_string());
                    }
                    println!(
                        "The the greatest product of the {} adjacent digits is {} = {}",
                        length,
                        tmp_vec.join("×"),
                        value
                    );
                }
                Err(err) => println!("{}", err),
            }
        }
    } else {
        println!("Non-numeric in list");
    }
}
/// 直接循环，“0”值影响
fn largest_product_in_a_series(length: u32, list: &[u32]) -> Result<(u64, Vec<u32>), &'static str> {
    let length = length as usize;
    if length > list.len() {
        Err("length > list.len()")
    } else {
        let mut max_idx = 0;
        let mut mul_max = 0 as u64;
        for i in 0..(list.len() - length) {
            if let Some(child_list) = list.get(i..(i + length)) {
                let mul_new = child_list.iter().fold(1, |mul, x| mul * *x as u64);
                if mul_new > mul_max {
                    max_idx = i;
                    mul_max = mul_new;
                }
            }
        }
        if let Some(child_list) = list.get(max_idx..(max_idx + length)) {
            Ok((mul_max, child_list.to_vec()))
        } else {
            Err("can't get list")
        }
    }
}
